package com.nineclock.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.nineclock.common.constant.NcConstant;
import com.nineclock.common.entity.UserInfo;
import com.nineclock.common.enums.ResponseEnum;
import com.nineclock.common.exception.NcException;
import com.nineclock.common.threadlocal.CurrentUserHolder;
import com.nineclock.common.utils.BeanHelper;
import com.nineclock.system.dto.SysCompanyContactConfigDTO;
import com.nineclock.system.mapper.SysCompanyContactConfigMapper;
import com.nineclock.system.pojo.SysCompanyContactConfig;
import com.nineclock.system.service.SysCompanyContactConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *
 * ThreadLocal: 可以在线程中存储数据， 在当前线程中任意位置可以直接获取
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
@Slf4j
public class SysCompanyContactConfigServiceImpl implements SysCompanyContactConfigService {

    @Autowired
    SysCompanyContactConfigMapper companyContactConfigMapper;

    @Override
    public void addCompanyContactConfig(SysCompanyContactConfigDTO sysCompanyContactConfigDTO) {
        //健壮性判断
        if(sysCompanyContactConfigDTO == null || sysCompanyContactConfigDTO.getName() == null){
//            throw new RuntimeException("添加企业通讯录字段值无效 ！！！");
            throw new NcException(ResponseEnum.INVALID_PARAM_ERROR);
        }

        UserInfo userInfo = CurrentUserHolder.get();
        //获取企业id
        Long companyId = userInfo.getCompanyId();

        //复制DTO的数据 到 POJO(只会复制 相同类型，相同名称的字段)
        SysCompanyContactConfig companyContactConfig = BeanHelper.copyProperties(sysCompanyContactConfigDTO, SysCompanyContactConfig.class);

        //设置字段类型
        companyContactConfig.setFieldType("String");
        //设置状态值
        companyContactConfig.setStatus((short)1);
        companyContactConfig.setCompanyId(companyId);

        //新增企业通讯录
        companyContactConfigMapper.insert(companyContactConfig);
    }

    /**
     * 查询并初始化 企业通讯录字段
     * 1. 判断是否是初次使用
     * 2. 如果初次使用，初始化默认字段
     * 3. 如果不是初次使用，查询并返回
     * @return
     */
    @Override
    public List<SysCompanyContactConfigDTO> queryCompanyContactConfig() {
        UserInfo userInfo = CurrentUserHolder.get();
        //获取企业id
        Long companyId = userInfo.getCompanyId();

        LambdaQueryWrapper<SysCompanyContactConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysCompanyContactConfig::getCompanyId, companyId);

        Integer count = companyContactConfigMapper.selectCount(wrapper);

        //如果初次使用， 初始化默认字段
        if(count == 0){
            for (String name : NcConstant.COMPANY_CONFIG_CONTACT_LIST) {
                SysCompanyContactConfig companyContactConfig = new SysCompanyContactConfig();
                companyContactConfig.setName(name);
                companyContactConfig.setType("fixed");
                companyContactConfig.setFieldType("String");
                companyContactConfig.setCompanyId(companyId);
                companyContactConfig.setStatus((short)1);

                companyContactConfigMapper.insert(companyContactConfig);
            }
        }

        List<SysCompanyContactConfig> companyContactConfigs = companyContactConfigMapper.selectList(wrapper);
        //把 POJO 转换为 DTO
        List<SysCompanyContactConfigDTO> companyContactConfigDTOList = BeanHelper.copyWithCollection(companyContactConfigs, SysCompanyContactConfigDTO.class);

        return companyContactConfigDTOList;
    }

    @Override
    public void updateCompanyContactConfig(Long id, Short status) {
        //健壮性的判断
        if(id == null || status == null){
            throw new RuntimeException("非法的请求参数");
        }
        //根据id查询
        SysCompanyContactConfig companyContactConfig = companyContactConfigMapper.selectById(id);
        if(companyContactConfig == null){
            throw new RuntimeException("没有查询到对应的企业通讯录字段");
        }

        //如果不为null， 更新字段
        companyContactConfig.setStatus(status);
        companyContactConfigMapper.updateById(companyContactConfig);
    }
}
